package com.prs.crm.service;

import java.util.List;

import org.courser.ui.PaginationSupport;
import org.hibernate.criterion.DetachedCriteria;

import com.prs.crm.domain.FlowEntity;
import com.prs.crm.domain.flow.WorkFlowHandler;
import com.prs.crm.domain.flow.WorkFlowInstance;
import com.prs.crm.domain.flow.WorkFlowProcess;
import com.prs.crm.domain.flow.WorkFlowProcessNode;
import com.prs.crm.domain.flow.WorkFlowProcessNodeDetail;
import com.prs.crm.domain.hr.Person;
import com.prs.crm.flow.WorkFlowExecutor;

public interface FlowService<K extends FlowEntity> extends BaseService<K> {
	
	/**
	 * 提交并运行审批流程，如果制定流程实例存在
	 * @param entity
	 * @param instance
	 * @return
	 */
	WorkFlowProcess submitFlow(K entity,WorkFlowInstance instance);
	
	

	
	
	/**
	 * 获取流程的执行器
	 * @return
	 */
	WorkFlowExecutor getWorkflowExecutor();
	
	/**
	 * 判断一个实体是否处于流程中
	 */
	boolean inWorkFlowProcess(K entity);
	
	/**
	 * 验证是否可以提交
	 * 提供默认实现,如果有其他实现，请在继承类中重写
	 * @param entity
	 * @return
	 */
	boolean valideSubmit(K entity);
	
	/**
	 * 推出审批流程
	 * @param entity 审批流程关联的实体
	 */
	void cancelProcess(K entity);
	
	/**
	 * 指定流程执行人
	 * @param entity
	 * @param handlers
	 */
	void setWorkFlowHandler(K entity,List<WorkFlowHandler> handlers);
	
	/**
	 * 开始一个流程
	 * 提供默认实现，如果有其他实现，在具体实现类中重写
	 * @param entity
	 */
	void startWorkFlow(K entity);//开始一个流程
	
	
	/**
	 * 执行一个流程
	 * @param node 当前流程的结点
	 * @param detail 执行的明细
	 * @param entity 流程关联的实体
	 * @param executor 执行人
	 */
	void execute(WorkFlowProcessNode node,WorkFlowProcessNodeDetail detail,K entity,Person executor);
	
	
	/**
	 * 获取流程相关实体
	 * @param process 流程实例
	 * @return
	 */
	K getProcessEntity(WorkFlowProcess process);
	/**
	 * 查询指定流程状态的实体
	 * @param detachCriteria
	 * @param page
	 * @param status
	 * @return
	 */
	PaginationSupport pageQueryByFlowStatus(final DetachedCriteria detachCriteria, final PaginationSupport page,Integer[] status);
	
	/**
	 * 查询流程结束或则审核通过的实体                                                                            
	 * @param detachCriteria
	 * @param page
	 * @return
	 */
	PaginationSupport pageQueryValid(final DetachedCriteria detachCriteria, final PaginationSupport page);
	
	/**
	 * 查询在审核流程中的实体
	 * @param detachCriteria
	 * @param page
	 * @return
	 */
	PaginationSupport pageQueryInProcess(final DetachedCriteria detachCriteria, final PaginationSupport page);
	
	/**
	 * 查询执行人当前所有的执行任务
	 * @param cls 流程对应domain的class声明
	 * @param page
	 * @param person 执行人
	 * @return
	 */
	@SuppressWarnings("unchecked")
	PaginationSupport  listFlowTask(Class cls, PaginationSupport page,Person person);
}
